package org.tri.persistence.search;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.tri.entity.AbstractCompra;

/**
 * La clase {@code AbstractBusquedaCompra} representa la base de
 * la jerarquía de buscadores de Compras.
 * @author kiira
 * @version 1.0, Nov 20, 2011
 */
public abstract class AbstractBusquedaCompra<K extends AbstractCompra>
        extends BusquedaTransaccion<K> {

    /**
     * Inicializa la busqueda.
     * @param clase clase de la entidad a buscar.
     */
    public AbstractBusquedaCompra( Class<K> clase ) {
        super( clase );

    }//end constructor

    /**
     * Restringe la busqueda a un número de factura exacto 
     * A pesar de que sea el número exacto, esta busqueda puede
     * devolver más de un resultado, dado que pueden existir varias
     * facturas con el mismo número. Para restringir mejor la busqueda,
     * se deberia llamar también al método {@code porEstablecimiento}.
     * @param numeroFactura número de factura por el cual filtrar.
     */
    public void porNumeroDeFacturaExacto( Long numeroFactura ) {
        //creamos y agregamos la restriccion
        Criterion restriccionFactura = Restrictions.eq( "nroFactura",
                                                        numeroFactura );

        agregarCriterio( restriccionFactura );

    }//end método porNumeroDeFacturaExacto

    /**
     * Restringe la busqueda a un número de factura, filtrando
     * todas aquellas compras que no empiezen con la {@code String}
     * indicada en su número de factura.
     * @param numeroFactura número de factura o porción de número
     * por el cual filtrar.
     */
    public void porNumeroDeFactura( String numeroFactura ) {
        //creamos y agregamos la restriccion
        Criterion restriccionFactura = Restrictions.sqlRestriction(
                String.format(
                "CAST( {alias}.nro_factura as string ) like '%s%%'", 
                numeroFactura ) );

        agregarCriterio( restriccionFactura );

    }//end método porNumeroDeFactura

    /**
     * Restringe la busqueda a un número de factura, filtrando
     * todas aquellas compras cuyo número de factura no empieza
     * con el número indicado.
     * @param numeroFactura número de factura o porción del número 
     * de factura por el cual filtrar.
     */
    public void porNumeroDeFactura( Long numeroFactura ) {
        porNumeroDeFactura( String.valueOf( numeroFactura ) );

    }//end método porNumeroDeFactura

    /**
     * Restringe las busqueda a animales nacidos en el establecimiento.
     * @param propias si se quieren listar o no las caravanas propias.
     */
    public void porCaravanasPropias( boolean propias ) {
        Criterion restriccionCaravanas;

        if ( propias )
            restriccionCaravanas = Restrictions.eq( "dtaOrigen", 0L );
        else
            restriccionCaravanas = Restrictions.eq( "nroFactura", 0L );

        agregarCriterio( restriccionCaravanas );

    }//end metodo porCaravanasPropias
    
    /**
     * Restringe la busqueda a un numero de dta.
     * @param dta numero de dta por el cual buscar
     */
    public void porDta(long dta){
        Criterion restriccionDta = Restrictions.eq( "dtaOrigen", dta);
        
        agregarCriterio( restriccionDta );
        
    }//end metodo porDta
    
    /**
     * Restringe la busqueda a un numero de renspa.
     * @param renspa numero de renspa por el cual buscar
     */
    public void porRenspa(long renspa){
        Criterion restriccionRenspa = Restrictions.eq( "renspaOrigen", renspa );
        
        agregarCriterio( restriccionRenspa );
        
    }//end metodo porRenspa
    
    /**
     * Restringe la busqueda a un tipo de factura
     * @param tipoFactura tipo de factura por el cual buscar
     */
    public void porTipoFactura(String tipoFactura){
        Criterion criterioTipoFactura = Restrictions.like( "tipoFactura" , tipoFactura + "%");
        
        agregarCriterio( criterioTipoFactura );
        
    }

}//end clase AbstractBusquedaCompra

